home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / coverf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-14  |  5.3 KB  |  221 lines

  1. /* 前のカバーを開いてジグザグ扇弾(を出す敵) */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13. #define PALET_COVERF    0x0600
  14.  
  15. #define SPEED_1        2    /* 加速度 */
  16. #define SPEED_1N    24    /* 加速度を足す回数 */
  17.  
  18. #define SPEED_2        3    /* 撤退時の加速度 */
  19. #define SPEED_2N    28    /* 加速度を足す回数 */
  20.  
  21.  
  22. enum {
  23.     MOVETO_INIT = 0,    /* 初期状態 */
  24.     MOVETO_L,        /* 左に移動 */
  25.     MOVETO_R
  26. };
  27.  
  28. static short EnemyMoveCoverF (ENEMY *);
  29. static void EnemyTiniCoverF (ENEMY *);
  30.  
  31.  
  32. void EnemyInitCoverF (ENEMY * p)
  33. {
  34.     p->vx = 0;
  35.     p->vy = 2 * 65536;
  36.     p->hit_px = 24;
  37.     p->hit_py = 16;
  38.     p->hit_sx = 24;
  39.     p->hit_sy = 16;
  40.     p->hit_cx = 6;
  41.     p->damage = 0;
  42.     p->flash = 0;
  43.     p->hp = 300;
  44.     p->pt = obj_coverf;
  45.     p->core_pt = sp_core01;
  46.     p->seq = 0;
  47.     p->func_enemy_move = EnemyMoveCoverF;
  48.     p->func_enemy_tini = EnemyTiniCoverF;
  49.  
  50.     if (SHORT_LX < (128 + 16))
  51.         p->cwork = 0;    /* 左から出現した */
  52.     else
  53.         p->cwork = !0;
  54. }
  55.  
  56.  
  57.  
  58. static short EnemyMoveCoverF (ENEMY * p)
  59. {
  60.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  61.     p->x = (p->lx += p->vx) >> 16;
  62.     p->y = (p->ly += p->vy) >> 16;
  63.  
  64.     switch (p->seq) {
  65.     case 0:        /* 出現後減速 */
  66.         if (SHORT_LY > 32) {
  67.             p->vy -= 2048;
  68.         }
  69.         if (SHORT_VY < 0) {
  70.             p->vy = 0;
  71.             p->seq++;
  72.             p->m_work = MOVETO_INIT;
  73.             p->m_work2 = 0;
  74.             p->m_work3 = 0;    /* 左右に移動した回数 */
  75.             p->s_work = 0;
  76.         }
  77.         break;
  78.     case 1:
  79.         /* まず移動処理 */
  80.         if (p->m_work == MOVETO_INIT) {
  81.             /* 初期状態なら */
  82.             if (p->cwork == 0)
  83.                 p->m_work = MOVETO_R;    /* 移動方向 */
  84.             else
  85.                 p->m_work = MOVETO_L;    /* 移動方向 */
  86.             p->m_work2 = 0;
  87.         }
  88.         if (p->m_work2 == 0) {
  89.             /* 初回なら */
  90.             signed short dx, dy;
  91.             signed short dx_table[3] =
  92.             {0, -64, 64};
  93.             signed short dy_table[6] =
  94.             {24, -16, 4, 24, -8, 8};
  95.             short m_work_table[3] =
  96.             {MOVETO_INIT, MOVETO_R, MOVETO_L};
  97.  
  98.             p->m_work2 = !0;
  99.             /* 順に左→右→左へ移動 */
  100.             dx = SHORT_LX + dx_table[p->m_work];
  101.             dy = SHORT_LY + dy_table[p->m_work];
  102.             p->m_work = m_work_table[p->m_work];
  103.  
  104.             if (p->m_work3++ < 4) {
  105.                 SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
  106.             } else {
  107.                 SubEnemyMoveToInit (p, p->x, 256 + 64, SPEED_2, SPEED_2N);
  108.                 p->seq++;    /* 撤退 */
  109.             }
  110.         } else {
  111.             /* 設定値に従って移動 */
  112.             if (SubEnemyMoveTo (p) < 0)
  113.                 p->m_work2 = 0;    /* 移動方向再設定 */
  114.         }
  115.  
  116.         /* 次に攻撃処理 */
  117. #define TIMER_SHOT_START    30
  118. #define TIMER_SHOT_END    (TIMER_SHOT_START + 15 * 6)
  119.  
  120.         p->s_work++;
  121.  
  122.         if ((p->s_work >= TIMER_SHOT_START - 11) && (p->s_work < TIMER_SHOT_START))
  123.             p->pt++;
  124.         if ((p->s_work >= TIMER_SHOT_END) && (p->s_work < TIMER_SHOT_END + 11))
  125.             p->pt--;
  126.  
  127.         switch (p->s_work) {
  128.         case TIMER_SHOT_START - 1:
  129.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  130.             break;
  131.         case TIMER_SHOT_START + 15 * 0:
  132.         case TIMER_SHOT_START + 15 * 2:
  133.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle - 24, 0);
  134.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle - 8, 0);
  135.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle + 8, 0);
  136.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle + 24, 0);
  137.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  138.             break;
  139.         case TIMER_SHOT_START + 15 * 1:
  140.         case TIMER_SHOT_START + 15 * 3:
  141.         case TIMER_SHOT_START + 15 * 5:
  142.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle - 32, 0);
  143.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle - 16, 0);
  144.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle, 0);
  145.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle + 16, 0);
  146.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 7, p->s_angle + 32, 0);
  147.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  148.             break;
  149.         case TIMER_SHOT_END + 55:
  150.             p->s_work = 0;
  151.             break;
  152.         default:
  153.             break;
  154.         }
  155.         break;
  156.  
  157.     case 2:
  158.         /* 設定値に従って移動 */
  159.         if ((SubEnemyMoveTo (p) < 0) || (SHORT_LY > 256 + 32))
  160.             return (-1);    /* 消去 */
  161.         if (p->pt > obj_coverf)
  162.         p->pt--;
  163.  
  164.         break;
  165.     }
  166.  
  167.     /* 自機ショットに当たった時の処理 */
  168.     if (p->damage) {
  169.         if (p->damage_core) {
  170.             SoundSetSE (SE_CORE_DAMAGE);
  171.             p->info = PALET_RED | PRIORITY_BOSS;
  172.             p->damage_core = 0;
  173.         } else {
  174.             SoundSetSE (SE_DAMAGE);
  175.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  176.         }
  177.         if ((p->hp -= p->damage) <= 0) {
  178.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  179.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  180.  
  181.             if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS))
  182.                 EffectInit (EFFECT_POINTS_RED, POINTS_2000, p->x, p->y);
  183.             else
  184.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_1000, p->x, p->y);
  185.             if (disp_level == DISP_LEVEL_HIGH)
  186.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  187.             return (-1);    /* 消去 */
  188.         }
  189.         p->damage = 0;
  190.         p->flash = TIMER_FLASH_DAMAGE;
  191.     } else {
  192.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 100)) {
  193.             p->info = PALET_RED | PRIORITY_BOSS;
  194.             if (p->flash > TIMER_FLASH_NORMAL)
  195.                 p->flash = 0;
  196.         } else {
  197.             p->info = PALET_COVERF | PRIORITY_BOSS;
  198.         }
  199.     }
  200.  
  201.     xobj_set_st (p);
  202.  
  203.     /* コアの表示 */
  204.     if (p->y + 64 > player->y)
  205.         p->core_info = PALET_CORE_RED | PRIORITY_BOSS;
  206.     else
  207.         p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  208.  
  209.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  210.     p->core_y = p->y - 8;
  211.     xsp_set_st (&(p->core_x));
  212.  
  213.     return (0);
  214. }
  215.  
  216.  
  217.  
  218. static void EnemyTiniCoverF (ENEMY * p)
  219. {
  220. }
  221.